package me.mingshan.leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * https://leetcode.cn/problems/leaf-similar-trees/description/
 * <p>
 * 请考虑一棵二叉树上所有的叶子，这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
 * <p>
 * <p>
 * <p>
 * 举个例子，如上图所示，给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。
 * <p>
 * 如果有两棵二叉树的叶值序列是相同，那么我们就认为它们是 叶相似 的。
 * <p>
 * 如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的，则返回 true；否则返回 false 。
 *
 * @author hanjuntao
 * @date 2025/8/27 0027
 */
public class L_872_叶子相似的树 {

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(8);

        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        TreeNode root2 = new TreeNode(1);
        root2.left = new TreeNode(2);
        root2.right = new TreeNode(3);

        root2.left.left = new TreeNode(4);
        root2.left.right = new TreeNode(5);

        System.out.println(leafSimilar(root, root2));
    }

    /**
     * 思路：
     *
     * 1. 采取先序遍历
     * 2. 获取叶子节点的值
     * 3. 比较两个列表是否相等
     *
     * @param root1
     * @param root2
     * @return
     */
    public static boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> leafValue1 = new ArrayList<>();
        List<Integer> leafValue2 = new ArrayList<>();

        getLeafValue(root1, leafValue1);
        getLeafValue(root2, leafValue2);

        return leafValue1.equals(leafValue2);
    }

    private static void getLeafValue(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }

        if (root.left == null && root.right == null) {
            result.add(root.val);
        }

        getLeafValue(root.left, result);
        getLeafValue(root.right, result);
    }
}
